home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / tcp / wu_ftpd_37_21.lha / wu-ftpd / src / fixes.c < prev    next >
C/C++ Source or Header  |  1994-09-09  |  2KB  |  74 lines

  1. /*
  2.  * This is a fixed version of lstat() from AmiTCP 3.0 beta 2.
  3.  *
  4.  * Author is Pekka Pessi <Pekka.Pessi@hut.fi>.
  5.  *
  6.  * Copyright © 1993,1994 AmiTCP/IP Group, <amitcp-group@hut.fi>
  7.  *             Helsinki University of Technology, Finland.
  8.  *             All rights reserved.
  9.  */
  10.  
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <stdarg.h>
  14. #include <errno.h>
  15. #include <sys/types.h>
  16. #include <sys/stat.h>
  17. #include <proto/dos.h>
  18. #include <proto/utility.h>
  19.  
  20. #include "AmiTCP:src/netlib/netlib.h"
  21. #include "AmiTCP:src/netlib/fibex.h"
  22.  
  23. int lstat(const char *name, struct stat *st)
  24. {
  25.   /* Cannot lock - do examine via Examine()/ExNext() */
  26.   int rc = -1;
  27.   char *cname;
  28.  
  29.   if (st == NULL || ((1 & (long)st) == 1)) {
  30.     errno = EFAULT;
  31.     return -1;
  32.   }
  33.  
  34.   cname = malloc(strlen(name) + 1);
  35.  
  36.   if (cname) {
  37.     BPTR lock;
  38.     char *pp = PathPart(strcpy(cname, name));
  39.     *pp = '\0';
  40.  
  41.     if (lock = Lock(cname, SHARED_LOCK)) {
  42.       pp = FilePart((char *)name);
  43.       
  44.       if (Examine(lock, __dostat_fib)) {
  45.     while (ExNext(lock, __dostat_fib)) {
  46.       if (Stricmp(pp, __dostat_fib->fib_FileName) == 0) {
  47.         __dostat(__dostat_fib, st);
  48.         st->st_dev = (dev_t)((struct FileLock *)BADDR(lock))->fl_Task;
  49.         rc = 0;
  50.         break;
  51.       }
  52.     }
  53.       } 
  54.       if (rc != 0)
  55.     errno = ENOENT;
  56.  
  57.       /* !!! FIX !!!
  58.        * This UnLock() was missing,
  59.        * fixed 08/94 by Blaz Zupan
  60.        */
  61.       UnLock(lock);
  62.  
  63.     } else {
  64.       set_errno(IoErr());
  65.     }
  66.  
  67.     free(cname);
  68.   } else {
  69.     errno = ENOMEM;
  70.   }
  71.  
  72.   return rc;
  73. }
  74.